home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 423_01 / recio200 / _rcbput.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-15  |  2.8 KB  |  77 lines

  1. /*****************************************************************************
  2.    MODULE: _rcbput.h
  3.   PURPOSE: recio column delimited integral number output functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.   VERSION: 2.00
  6.   RELEASE: April 15, 1994
  7. *****************************************************************************/
  8.  
  9. #ifndef _RCBPUT_H
  10. #define _RCBPUT_H
  11.  
  12. #include "recio.h"
  13.  
  14. extern int _rstatus(REC *rp, int mode);
  15. extern int _rputc(REC *rp, int ch);
  16.  
  17. #define rfp(rp)          ((rp)->r_fp)
  18. #define rcol(rp)         ((rp)->r_colno)
  19. #define rfldch(rp)       ((rp)->r_fldch)
  20.  
  21. /* macro to put column delimited integral number */
  22. #define rcbput_fn( /* define function to put number to record stream */\
  23.     fn_type,      /* defined function number type */\
  24.     fn_name,      /* defined function name */\
  25.     cv_type,      /* conversion function type */\
  26.     cv_name)      /* conversion function name */\
  27. \
  28. int                          /* return 0 on success; !0 on error */\
  29.     fn_name(                 /* put string to record stream      */\
  30.         REC    *rp,          /* record pointer                   */\
  31.         size_t begcol,       /* field inclusive beginning column */\
  32.         size_t endcol,       /* field inclusive ending column    */\
  33.         int     base,        /* base (radix) (2 to 36)           */\
  34.         fn_type num)         /* number to put to stream          */\
  35. { \
  36.     int err=EOF;             /* return error (0=no error; !0=error) */\
  37.     size_t sl;               /* length of _r_nsbuf */\
  38.     if (!_rstatus(rp, R_WRITE)) { \
  39.         if (endcol >= begcol && begcol >= rcolno(rp) && base >= 2 && base <= 36) { \
  40.             rfldno(rp)++; \
  41.             /* if colno < begcol, pad with spaces */\
  42.             while (rcolno(rp) < begcol) { \
  43.                 err = _rputc(rp, ' '); \
  44.                 if (err) goto done; \
  45.             } \
  46.             cv_name((cv_type)num, _r_nsbuf, base); \
  47.             sl = strlen(_r_nsbuf); \
  48.             /* if converted string fits space */\
  49.             if (sl <= (endcol-begcol+1)) { \
  50.                 while (rcolno(rp) <= endcol-sl) { \
  51.                     err = _rputc(rp, ' '); \
  52.                     if (err) goto done; \
  53.                 } \
  54.                 err = fputs(_r_nsbuf, rfp(rp)); \
  55.                 if (err==EOF) { \
  56.                     rseterr(rp, R_ENOPUT); \
  57.                 } else { \
  58.                     rcol(rp) += sl; \
  59.                     err = 0; \
  60.                 } \
  61.             /* else converted string too long for space */\
  62.             } else { \
  63.                 rsetwarn(rp, R_WWIDTH); \
  64.                 while (rcolno(rp) <= endcol) { \
  65.                     err = _rputc(rp, '*'); \
  66.                 } \
  67.             } \
  68.         } else { \
  69.             rseterr(rp, R_EINVAL); \
  70.         } \
  71.     } \
  72. done: \
  73.     return err; \
  74. }
  75.  
  76. #endif
  77.